}
static int
-map_p2m_entry(l1_pgentry_t *l1tab, unsigned long va,
- unsigned long gpa, unsigned long mfn)
+map_p2m_entry(l1_pgentry_t *l1tab, unsigned long gpfn, unsigned long mfn)
{
unsigned long *l0tab = NULL;
l1_pgentry_t l1e = { 0 };
struct page_info *page;
+ unsigned long va = RO_MPT_VIRT_START + (gpfn * sizeof(mfn));
l1e = l1tab[l1_table_offset(va)];
if ( !(l1e_get_flags(l1e) & _PAGE_PRESENT) )
else
l0tab = map_domain_page(l1e_get_pfn(l1e));
- l0tab[gpa & ((PAGE_SIZE / sizeof(mfn)) - 1)] = mfn;
+ l0tab[gpfn & ((PAGE_SIZE / sizeof(mfn)) - 1)] = mfn;
unmap_domain_page(l0tab);
unsigned long va = pfn << PAGE_SHIFT;
if ( shadow_mode_external(d) )
- {
tabpfn = pagetable_get_pfn(d->vcpu[0]->arch.monitor_table);
- va = RO_MPT_VIRT_START + (pfn * sizeof (unsigned long));
- }
else
- {
tabpfn = pagetable_get_pfn(d->arch.phys_table);
- va = pfn << PAGE_SHIFT;
- }
ASSERT(tabpfn != 0);
ASSERT(shadow_lock_is_acquired(d));
l1_pgentry_t *l1tab = NULL;
l2_pgentry_t l2e;
- l2e = l2[l2_table_offset(va)];
+ l2e = l2[l2_table_offset(RO_MPT_VIRT_START)];
ASSERT( l2e_get_flags(l2e) & _PAGE_PRESENT );
l1tab = map_domain_page(l2e_get_pfn(l2e));
- if ( !(error = map_p2m_entry(l1tab, va, pfn, mfn)) )
+ if ( !(error = map_p2m_entry(l1tab, pfn, mfn)) )
domain_crash(d);
unmap_domain_page(l1tab);
alloc_p2m_table(struct domain *d)
{
struct list_head *list_ent;
- unsigned long va = RO_MPT_VIRT_START; /* phys_to_machine_mapping */
l2_pgentry_t *l2tab = NULL;
l1_pgentry_t *l1tab = NULL;
{
l2tab = map_domain_page(
pagetable_get_pfn(d->vcpu[0]->arch.monitor_table));
- l2e = l2tab[l2_table_offset(va)];
+ l2e = l2tab[l2_table_offset(RO_MPT_VIRT_START)];
if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) )
{
page = alloc_domheap_page(NULL);
l1tab = map_domain_page(page_to_mfn(page));
memset(l1tab, 0, PAGE_SIZE);
- l2e = l2tab[l2_table_offset(va)] =
+ l2e = l2tab[l2_table_offset(RO_MPT_VIRT_START)] =
l2e_from_page(page, __PAGE_HYPERVISOR);
}
else
page = list_entry(list_ent, struct page_info, list);
mfn = page_to_mfn(page);
- if ( !(error = map_p2m_entry(l1tab, va, gpfn, mfn)) )
+ if ( !(error = map_p2m_entry(l1tab, gpfn, mfn)) )
{
domain_crash(d);
break;
}
list_ent = frame_table[mfn].list.next;
- va += sizeof(mfn);
}
unmap_domain_page(l1tab);
}
static int
-map_p2m_entry(pgentry_64_t *top_tab, unsigned long va,
- unsigned long gpfn, unsigned long mfn)
+map_p2m_entry(pgentry_64_t *top_tab, unsigned long gpfn, unsigned long mfn)
{
#if CONFIG_PAGING_LEVELS >= 4
pgentry_64_t l4e = { 0 };
l2_pgentry_t l2e = { 0 };
l1_pgentry_t l1e = { 0 };
struct page_info *page;
+ unsigned long va = RO_MPT_VIRT_START + (gpfn * sizeof(mfn));
#if CONFIG_PAGING_LEVELS >= 4
l4e = top_tab[l4_table_offset(va)];
unmap_domain_page(l1tab);
- l0tab[gpfn & ((PAGE_SIZE / sizeof (mfn)) - 1) ] = mfn;
+ l0tab[gpfn & ((PAGE_SIZE / sizeof(mfn)) - 1)] = mfn;
unmap_domain_page(l0tab);
struct domain_mmap_cache *l1cache)
{
unsigned long tabmfn = pagetable_get_pfn(d->vcpu[0]->arch.monitor_table);
- unsigned long va = RO_MPT_VIRT_START + (gpfn * sizeof(unsigned long));
pgentry_64_t *top_tab;
int error;
top_tab = map_domain_page_with_cache(tabmfn, l2cache);
- if ( !(error = map_p2m_entry(top_tab, va, gpfn, mfn)) )
+ if ( !(error = map_p2m_entry(top_tab, gpfn, mfn)) )
domain_crash(d);
unmap_domain_page_with_cache(top_tab, l2cache);
alloc_p2m_table(struct domain *d)
{
struct list_head *list_ent;
- unsigned long va = RO_MPT_VIRT_START; /* phys_to_machine_mapping */
pgentry_64_t *top_tab = NULL;
- unsigned long mfn;
- int gpfn, error = 0;
+ unsigned long gpfn, mfn;
+ int error = 0;
ASSERT( pagetable_get_pfn(d->vcpu[0]->arch.monitor_table) );
page = list_entry(list_ent, struct page_info, list);
mfn = page_to_mfn(page);
- if ( !(error = map_p2m_entry(top_tab, va, gpfn, mfn)) )
+ if ( !(error = map_p2m_entry(top_tab, gpfn, mfn)) )
{
domain_crash(d);
break;
}
list_ent = frame_table[mfn].list.next;
- va += sizeof(mfn);
}
unmap_domain_page(top_tab);